﻿// owner 蒋家伟

#pragma once

// jsdk
#include "TaskBase_home.h"

namespace jsdk
{
    class TaskGroup;
    class TaskId;
    class TaskManager;
    class ITaskDescription;
    // 所有任务的基类
    class TASKBASE_EXPORT ITask
    {
    public:
        /// \ brief 创建一个任务
        /// \ in opTaskDescription 任务的描述
        /// \ in delayTime 异步任务所需的延迟时间, note ： 如认为当前任务未同步任务则此参数设置无效
        /// \ 返回一个打包好的任务，此时任务并没有生成有效的TaskId
        static OwnerPtr<ITask> create(OwnerPtr<ITaskDescription> opTaskDescription, uint32_t delayTime = 0);
        virtual ~ITask() {}

        /// \ brief 获取当前任务的描述信息
        /// \ return ITaskDescription 指针
        virtual const ITaskDescription* getTaskDescription() const = 0;

        /// \ brief 任务执行
        /// \ return true表示执行成功
        virtual bool exctue() = 0;

        /// \ brief 获取任务组ID
        /// \ note 如果当前任务是一个任务组内的任务则存在一个有效的任务组ID
        /// \ return 当前任务所属组ID
        virtual const TaskId& getGroupId() const = 0;

        /// \ brief 当前任务是否属于一个任务组
        /// \ return true 是 or 否
        virtual bool isInGroup() const = 0;

        /// \ brief 获取任务Id
        virtual const TaskId& getTaskId() const = 0;

    private:
        friend class TaskManager;
        friend class TaskGroup;
        virtual void setTaskId(const TaskId& taskId) = 0;
        virtual void setTaskGroupId(const TaskId& taskGroupId) = 0;
        virtual bool hasDelayTime() const = 0;
        virtual void startTimer() const = 0;
        virtual void setDelayTime(uint32_t delayTime) = 0;
        /// \ brief 获取延迟时间
        /// \ return 返回传入的延迟时间
        virtual uint32_t getDelayTime() const = 0;
    };
}